home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / docs / mags / amique22.lha / ScreenMenu_v1.2.lha / ScreenMenu_v1.2 / ScreenMenu.c < prev    next >
C/C++ Source or Header  |  1995-05-23  |  10KB  |  377 lines

  1. #include "ScreenMenu.h"
  2.  
  3. #define ID_HOTKEY 3L
  4. #define RETURN 196
  5. #define ESC 197
  6.  
  7. #define NORMAL  1
  8. #define PUBLIC  2
  9. #define EGS     3
  10.  
  11. struct ScreenNode {
  12.   struct Node sn_Node;
  13.   struct Screen *sn_Screen;
  14. };
  15.  
  16. extern struct IntuitionBase *IntuitionBase;
  17. CxObj *myBroker;
  18. CxMsg *msg;
  19. struct MsgPort *myPort;
  20. ULONG cxsigflag;
  21.  
  22. const char version[] =
  23. {
  24.   "$VER: ScreenMenu 1.2 (5.8.94)"
  25. };
  26.  
  27. //+ main()
  28. void main(int argc, char **argv)
  29. {
  30.   UBYTE **ttypes, *hotkey;
  31.   struct Library *CxBase;
  32.   struct Library *IconBase;
  33.   CxObj *sender, *filter,*translate;
  34.   struct NewBroker myBrokerDef = {
  35.       NB_VERSION,
  36.       "ScreenMenu",
  37.       "ScreenMenu",
  38.       "Popup a list of screen",
  39.       NBU_UNIQUE|NBU_NOTIFY,
  40.       0, 0, 0, 0
  41.   };
  42.  
  43.   CxBase = OpenLibrary ("commodities.library",37L);
  44.   if (CxBase)
  45.   {
  46.     IconBase = OpenLibrary("icon.library", 37L);
  47.     if (IconBase)
  48.     {
  49.       myPort = CreateMsgPort();
  50.       if (myPort)
  51.       {
  52.         cxsigflag = 1L<<myPort->mp_SigBit;
  53.         ttypes = ArgArrayInit(argc, argv);
  54.         myBrokerDef.nb_Pri = (BYTE)ArgInt(ttypes, "CX_PRIORITY" ,128);
  55.         hotkey = ArgString(ttypes, "HOTKEY", "f10");
  56.  
  57.         myBrokerDef.nb_Port = myPort;
  58.         myBroker = CxBroker(&myBrokerDef, NULL);
  59.         if (myBroker)
  60.         {
  61.           filter = CxFilter(hotkey);
  62.           if (filter)
  63.           {
  64.             AttachCxObj(myBroker, filter);
  65.             sender = CxSender(myPort, ID_HOTKEY);
  66.             if (sender)
  67.             {
  68.               AttachCxObj(filter, sender);
  69.               translate = CxTranslate(NULL);
  70.               if (translate)
  71.               {
  72.                 AttachCxObj(filter,translate);
  73.                 if (!CxObjError(filter))
  74.                 {
  75.                   ActivateCxObj(myBroker, 1L);
  76.  
  77.                   ProcessBrokerMsg();
  78.                 }
  79.               }
  80.             }
  81.           }
  82.           DeleteCxObjAll(myBroker);
  83.           while (msg = (CxMsg *)GetMsg(myPort))
  84.             ReplyMsg((struct Message *)msg);
  85.         }
  86.         DeletePort(myPort);
  87.       }
  88.       ArgArrayDone();
  89.       CloseLibrary(IconBase);
  90.     }
  91.     CloseLibrary(CxBase);
  92.   }
  93. }
  94. //-
  95. //+ ProcessBrokerMsg()
  96. void ProcessBrokerMsg(void)
  97. {
  98.   CxMsg *cmsg;
  99.   ULONG sigrcvd, msgid, msgtype;
  100.   LONG returnvalue = 1L;
  101.  
  102.   while (returnvalue)
  103.   {
  104.     sigrcvd = Wait(SIGBREAKF_CTRL_C | cxsigflag);
  105.     while (msg = (CxMsg *)GetMsg (myPort))
  106.     {
  107.       msgid = CxMsgID(msg);
  108.       msgtype = CxMsgType(msg);
  109.       ReplyMsg((struct Message *)msg);
  110.       switch(msgtype)
  111.       {
  112.         case CXM_IEVENT:
  113.           switch(msgid)
  114.           {
  115.             case ID_HOTKEY:
  116.               windowtime();
  117.  
  118.               while (cmsg = (CxMsg *)GetMsg(myPort))
  119.                 ReplyMsg((struct Message *)msg);
  120.               break;
  121.           }
  122.           break;
  123.         case CXM_COMMAND:
  124.           switch(msgid)
  125.           {
  126.             case CXCMD_DISABLE:
  127.               ActivateCxObj(myBroker, 0L);
  128.               break;
  129.             case CXCMD_ENABLE:
  130.               ActivateCxObj(myBroker, 1L);
  131.               break;
  132.             case CXCMD_KILL:
  133.               returnvalue = 0L;
  134.               break;
  135.             case CXCMD_UNIQUE:
  136.               printf("ScreenMenu is now removed from memory!\n");
  137.               returnvalue = 0L;
  138.               break;
  139.           }
  140.           break;
  141.       }
  142.     }
  143.     if (sigrcvd & SIGBREAKF_CTRL_C)
  144.     {
  145.       returnvalue = 0L;
  146.     }
  147.   }
  148. }
  149. //-
  150. //+ windowtimer()
  151. void windowtime()
  152. {
  153.   UWORD number;
  154.   struct List ls;
  155.  
  156.   NewList(&ls);
  157.  
  158.   number = MakeScreenList(&ls);
  159.   if (SetupScreen() == 0)
  160.   {
  161.   
  162.     if (OpenSMWindow() == 0)
  163.     {
  164.       GT_SetGadgetAttrs(SMGadgets[0], SMWnd, NULL, GTLV_Labels, &ls,
  165.                              GTLV_Selected, 0, 
  166.                              TAG_DONE);
  167.  
  168.       ProcessEvent(SMWnd, &ls, SMGadgets[0], number);
  169.  
  170.       CloseSMWindow();
  171.     }
  172.     CloseDownScreen();
  173.   }
  174.  
  175.   FreeScreenList(&ls);
  176. }
  177. //-
  178. //+ MakeScreenList()
  179. UWORD MakeScreenList(struct List *ls)
  180. {
  181.   UWORD number=0, first=0;
  182.   ULONG num;
  183.   struct Screen *misc;
  184.   struct ScreenNode *blk;
  185.  
  186.   num = LockIBase(0);
  187.  
  188.   do 
  189.   {
  190.     if (first == 0) { misc = IntuitionBase->FirstScreen; first += 1; }
  191.     else misc = misc->NextScreen;
  192.     blk = (struct ScreenNode *)AllocMem(sizeof(struct ScreenNode), MEMF_CLEAR);
  193.     if (blk)
  194.     {
  195.       blk->sn_Node.ln_Name = misc->DefaultTitle;
  196.       blk->sn_Screen       = misc;
  197.       AddHead(ls, (struct Node *)blk);
  198.       number += 1;
  199.     }
  200.   } while(misc->NextScreen != NULL);
  201.  
  202.   UnlockIBase(num);
  203.  
  204.   return ((UWORD)(number));
  205. }
  206. //-
  207. //+ FreeScreenList()
  208. void FreeScreenList(struct List *ls )
  209. {
  210.   struct ScreenNode *blk;
  211.  
  212.   while (!IsListEmpty(ls))
  213.   {
  214.     blk = (struct ScreenNode *)RemHead(ls);
  215.     FreeMem(blk, sizeof(struct ScreenNode));
  216.   }
  217. }
  218. //-
  219. //+ ProcessEvent()
  220. void ProcessEvent(struct Window *win, struct List *ls,struct Gadget *lv, UWORD number)
  221. {
  222.   struct Gadget *gad;
  223.   SHORT Done;
  224.   struct Screen *misc;
  225.   struct ScreenNode *blk;
  226.   struct PubScreenNode *blk2;
  227.   ULONG i;
  228.   UWORD list = NORMAL, number2=0;
  229.   UWORD selected = 0;
  230.   struct IntuiMessage *msg;
  231.   struct List *ls2 = NULL;
  232.  
  233.   number -= 1;
  234.   Done = FALSE;
  235.   while (FALSE == Done)
  236.   {
  237.     Wait (1L<< win->UserPort->mp_SigBit);
  238.  
  239.     while ( (FALSE == Done) &&
  240.         (NULL != (msg = GT_GetIMsg(win->UserPort))))
  241.     {
  242.       switch(msg->Class)
  243.       {
  244.         case IDCMP_MOUSEBUTTONS:
  245.           if (msg->Code == IECODE_RBUTTON)
  246.             Done=TRUE;
  247.           break;
  248.         case IDCMP_INACTIVEWINDOW:
  249.           Done=TRUE;
  250.           break;
  251.         case IDCMP_RAWKEY:
  252.           switch(msg->Code)
  253.           {
  254.             case ESC:
  255.               Done = TRUE;
  256.               break;
  257.             case CURSORUP:
  258.               if (selected > 0)
  259.                 selected--;
  260.               else
  261.                 selected = (list == NORMAL) ? number : number2;
  262.               GT_SetGadgetAttrs(lv, win, NULL, GTLV_Selected, (ULONG)selected, TAG_DONE);
  263.               break;
  264.             case CURSORDOWN:
  265.               if (selected < ((list == NORMAL) ? number : number2)) 
  266.                 selected++;
  267.               else
  268.                 selected = 0;
  269.               GT_SetGadgetAttrs(lv, win, NULL, GTLV_Selected, (ULONG)selected, TAG_DONE);
  270.               break;
  271.             case RETURN:
  272.               if (list == NORMAL)
  273.               {
  274.                 blk = (struct ScreenNode *)ls->lh_Head;
  275.                 i = (ULONG)selected;
  276.                 while (i != 0)
  277.                 {
  278.                   blk = (struct ScreenNode *)blk->sn_Node.ln_Succ;
  279.                   --i;
  280.                 }
  281.                 misc = blk->sn_Screen;
  282.                 ScreenToFront(misc);
  283.                 ActivateWindow(misc->FirstWindow);
  284.                 Done = TRUE;
  285.               }
  286.               if (list == PUBLIC)
  287.               {
  288.                 blk2 = (struct PubScreenNode *)ls2->lh_Head;
  289.                 i = (ULONG)selected;
  290.                 while (i != 0)
  291.                 {
  292.                   blk2 = (struct PubScreenNode *)blk2->psn_Node.ln_Succ;
  293.                   --i;
  294.                 }
  295.                 misc = blk2->psn_Screen;
  296.                 ScreenToFront(misc);
  297.                 ActivateWindow(misc->FirstWindow);
  298.                 Done = TRUE;
  299.               } 
  300.               break;
  301.           }
  302.           break;
  303.         case IDCMP_GADGETUP:
  304.           gad = (struct Gadget *)msg->IAddress;
  305.           switch((ULONG)gad->UserData)
  306.           {
  307.             case 1:
  308.               if (list == NORMAL) {
  309.                 blk = (struct ScreenNode *)ls->lh_Head;
  310.                 i = (ULONG)msg->Code;
  311.                 while (i != 0)
  312.                 {
  313.                   blk = (struct ScreenNode *)blk->sn_Node.ln_Succ;
  314.                   --i;
  315.                 }
  316.                 misc = blk->sn_Screen;
  317.                 ScreenToFront(misc);
  318.                 ActivateWindow(misc->FirstWindow);
  319.                 Done = TRUE;
  320.               }
  321.               if (list == PUBLIC) {
  322.                 blk2 = (struct PubScreenNode *)ls2->lh_Head;
  323.                 i = (ULONG)msg->Code;
  324.                 while (i != 0)
  325.                 {
  326.                   blk2 = (struct PubScreenNode *)blk2->psn_Node.ln_Succ;
  327.                   --i;
  328.                 }
  329.                 misc = blk2->psn_Screen;
  330.                 ScreenToFront(misc);
  331.                 ActivateWindow(misc->FirstWindow);
  332.                 Done = TRUE;
  333.               }
  334.               break;
  335.             case 2:
  336.             {
  337.               ULONG temp;
  338.   
  339.               GT_GetGadgetAttrs(gad, win, NULL, GTCY_Active, &temp, TAG_DONE);
  340.               switch(temp)
  341.               {
  342.                 case 0:
  343.                   list = NORMAL;
  344.                   GT_SetGadgetAttrs(lv, win, NULL, GTLV_Labels, ls,
  345.                                    GTLV_Selected, 0,
  346.                                    TAG_DONE);
  347.                   break;
  348.                 case 1:
  349.                 {
  350.                   struct Node *tmp;
  351.  
  352.                   list = PUBLIC;
  353.                   ls2 = LockPubScreenList();
  354.                   UnlockPubScreenList();
  355.                   for (tmp = ls2->lh_Head, number2 = 0; tmp->ln_Succ; tmp = tmp->ln_Succ) number2++; 
  356.                   GT_SetGadgetAttrs(lv, win, NULL, GTLV_Labels, ls2,
  357.                                    GTLV_Selected, 0,
  358.                                    TAG_DONE);
  359.                 }
  360.                 break;
  361.                 /*case 2:
  362.                   list = EGS;
  363.                   GT_SetGadgetAttrs(lv, win, NULL, GTLV_Labels, ~0,
  364.                                    TAG_DONE);
  365.                   break;*/
  366.               }
  367.             }
  368.             break;               
  369.           }
  370.           break;
  371.       }
  372.       GT_ReplyIMsg(msg);
  373.     }
  374.   }
  375. }
  376. //-
  377.